/*
 * @Author: Qimu
 * @Date: 2020-04-23 13:38:59
 * @LastEditors: Qimu
 * @LastEditTime: 2020-07-12 02:38:33
 * @Description: file content
 * @FilePath: \vue-admin-koa2\koa2_api\controllers\menu.js
 */

const Menu = require('../module/schama/menu');
const Submenu = require('../module/schama/submenu');
const query = require('../module/utlis/query');
const config = require('../module/config/config');

//一级菜单业务
class MenuController {
  //新增一级菜单数据(POST)
  static async setMenu(ctx) {
    const {
      menu_id,
      menu_name,
      menu_level,
      menu_path,
      menu_icon
    } = ctx.request.body;
    const data = {
      menu_id, menu_name, menu_level, menu_path: `/${menu_path}`, menu_icon
    }
    let queryResult = await query.find(Menu, { menu_id });//查找数据结果
    if (queryResult.length > 0) {
      ctx.body = {
        'meta': {
          'status': 500,
          'message': `${menu_name}-菜单已经有相同的ID!`
        }
      }
    } else {
      await query.save(Menu, data);
      ctx.body = {
        'meta': {
          'status': 200,
          'message': `${menu_name}-菜单保存成功!`
        }
      }
    }
  }

  //新增二级菜单数据(POST)
  static async setSubmenu(ctx) {
    const {
      subMenuIdvalue,
      menu_name,
      menu_level,
      menu_path,
    } = ctx.request.body;
    let parent_id = subMenuIdvalue;
    const data = {
      parent_id, menu_name, menu_level, menu_path
    }
    let saveResult = await query.save(Submenu, data);
    if (saveResult) {
      ctx.body = {
        'meta': {
          'status': 200,
          'message': `${menu_name}菜单保存成功!`
        }
      }
    } else {
      ctx.body = {
        'meta': {
          'status': 500,
          'message': `${menu_name}菜单没有一级菜单ID!`
        }
      }
    }
  }

  //获取菜单数据(POST)
  static async listMenu(ctx) {
    const options = [
      {
        $lookup: {
          from: `${config.mongodb.table}submenu`,//集合 qc.submenu
          localField: '_id',
          foreignField: 'parent_id',
          as: 'children'
        }
      },
      {
        $project: { //联表查询后显示某些字段值，不想全部都显示出来
          _id: 1,
          menu_path: 1,
          menu_status: 1,
          menu_id: 1,
          menu_name: 1,
          menu_level: 1,
          menu_id: 1,
          menu_icon: 1,
          children: {
            _id: 1,
            menu_id: 1,
            menu_status: 1,
            menu_name: 1,
            menu_level: 1,
            menu_path: 1,
            menu_status: 1,
          }
        }
      },
      {
        $sort: {
          menu_id: 1,
        }//按照menu_id字段值排序
      }
    ]
    let queryResult = await query.aggregate(Menu, options);//聚合管道查找数据结果
    if (queryResult) {
      ctx.body = {
        'data': queryResult,
        'meta': {
          'status': 200,
          'message': `菜单获取成功!`
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': `菜单获取失败!`
        }
      }
    }
  }

  //显示编辑菜单
  static async showEditMenu(ctx) {
    const { _id, menu_level } = ctx.request.body;
    let queryResult
    if (menu_level === 1) {//根据菜单层级查找
      queryResult = await query.find(Menu, { _id });//查找Menu数据结果
    } else {
      queryResult = await Submenu.find({ _id }).populate('parent_id', (err, res) => {//查找Submenu数据结果
        err ? console.log(err) : res
      })
    }
    if (queryResult.length > 0) {
      ctx.body = {
        'data': {
          '_id': queryResult[0]._id,
          'menu_name': queryResult[0].menu_name,
          'menu_id': queryResult[0].menu_id,
          'menu_level': queryResult[0].menu_level,
          'menu': queryResult[0].parent_id,
        },
        'meta': {
          'status': 200,
          'message': `${queryResult[0].menu_name}-菜单获取成功!`
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': `当前菜单信息获取失败!`
        }
      }
    }
  }


  //提交编辑菜单
  static async putEditMenu(ctx) {
    let updateResult
    if (ctx.request.body.menu_level === 1) {//根据菜单层级修改
      const { menu_id, menu_name, menu_level, _id } = ctx.request.body;
      const data = { menu_id, menu_name, menu_level }
      updateResult = await query.updateOne(Menu, { _id }, data);//更新Menu数据结果
      if (updateResult.ok === 1) {
        ctx.body = {
          'data': {},
          'meta': {
            'status': 200,
            'message': `${menu_name}-菜单编辑成功!`
          }
        }
      } else {
        ctx.body = {
          'data': {},
          'meta': {
            'status': 500,
            'message': `${menu_name}-菜单编辑失败!`
          }
        }
      }
    } else {
      const { menu_name, _id, selectValueId } = ctx.request.body;
      updateResult = await query.updateOne(Submenu, { _id }, { menu_name, parent_id: selectValueId });//更新Submenu数据结果
      if (updateResult.ok === 1) {
        ctx.body = {
          'data': {},
          'meta': {
            'status': 200,
            'message': `${menu_name}-菜单编辑成功!`
          }
        }
      } else {
        ctx.body = {
          'data': {},
          'meta': {
            'status': 500,
            'message': `${menu_name}-菜单编辑失败!`
          }
        }
      }
    }
  }

  //删除菜单
  static async deleteMenu(ctx) {
    let menu_level = Number(ctx.params.level)
    let deleteResult
    if (menu_level === 1) {//根据菜单层级查找
      deleteResult = await query.find(Menu, { _id: ctx.params.id })
      await Menu.deleteMany({ _id: ctx.params.id }, async (err, res) => {//删除Menu数据结果
        err ? console.log(err) : await Submenu.find({ parent_id: ctx.params.id }).populate('parent_id').deleteMany({ menu_level: 2 }, (err, res) => {//删除Submenu数据结果
          err ? console.log(err) : res
        })
      });
    } else {
      deleteResult = await query.findByIdAndDelete(Submenu, { _id: ctx.params.id });//删除单个Submenu数据结果
    }
    if (deleteResult) {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 200,
          'message': menu_level === 1 ? `${deleteResult[0].menu_name}-菜单删除成功!` : `${deleteResult.menu_name}-菜单删除成功!`
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': menu_level === 1 ? `${deleteResult[0].menu_name}-菜单删除失败!` : `${deleteResult.menu_name}-菜单删除失败!`
        }
      }
    }
  }
}

exports = module.exports = MenuController
//一种方法
// deleteResult = await query.findByIdAndDelete(Menu, { _id: ctx.params.id });//删除Menu数据结果
// await queryResult.forEach(element => {
//   deleteResult = query.findByIdAndDelete(Submenu, { _id: element._id });//删除Submenu数据结果
// });